package com.example.java.zuo.新手班.class01;

/**
 * @Author : 佩萁
 * Description :求阶乘算法
 * @Create : 2023/12/13 - 11:09
 */
public class Code02_SumOfFactorial {
    //方法一:每一次求阶乘都计算
    public static long f1(int N) {
        long ans = 0;
        for (int i = 1; i <= N; i++) {
            ans += factorial(i);//求一个数的阶乘之和
        }
        return ans;
    }

    //求一个数的阶乘
    public static long factorial(int N) {
        long ans = 1;
        for (int i = 1; i <= N; i++) {
            ans *= i;
        }
        return ans;
    }
    //方法二:下一次的阶乘等于上一次阶乘得出的数乘以下一次阶乘的最大数，每次计算阶乘只需要乘一次，计算量大大减小
    public static long f2(int N) {
        long ans = 0;
        long cur = 1;
        for (int i = 1; i <= N; i++) {
            cur = cur * i;
            ans += cur;
        }
        return ans;
    }

    public static void main(String[] args) {
        int N = 4;
        System.out.println(f1(N));
        System.out.println(f2(N));
    }
}
